/**
  ****************************(C) COPYRIGHT 2019 DJI****************************
  * @file       detect_task.c/h
  * @brief      检测错误任务， 通过接收数据时间来判断.提供 检测钩子函数,错误存在函数.
  * @note
  * @history
  *  Version    Date            Author          Modification
  *  V1.0.0     Dec-26-2018     RM              1. done
  *  V1.1.0     Nov-11-2019     RM              1. add oled, gyro accel and mag sensors
  *
  @verbatim
  ==============================================================================
	如果要添加一个新设备
	1.第一步在detect_task.h，添加设备名字在errorList的最后，像
	enum errorList
	{
		...
		XXX_TOE,    //新设备
		ERROR_LIST_LENGHT,
	};
	2.在detect_init函数,添加offlineTime, onlinetime, priority参数
		uint16_t set_item[ERROR_LIST_LENGHT][3] =
		{
			...
			{n,n,n}, //XX_TOE
		};
	3.如果有data_is_error_fun ,solve_lost_fun,solve_data_error_fun函数，赋值到函数指针
	4.在XXX_TOE设备数据来的时候, 添加函数detect_hook(XXX_TOE).
  ==============================================================================
  @endverbatim
  ****************************(C) COPYRIGHT 2021 DJI****************************
  */

#ifndef DETECT_TASK_H
#define DETECT_TASK_H
#include "struct_typedef.h"
#include "main.h"

#define DETECT_TASK_INIT_TIME 57   
#define DETECT_CONTROL_TIME 10

  //错误码以及对应设备顺序
enum errorList
{
	DBUS_TOE = 0,
	
	translation_motor_TOE,      //横向移动平台电机1个  3508
	Clamp_turn_MOTOR1_TOE,	    //夹具旋转电机2个      3508
	Clamp_turn_MOTOR2_TOE,

	friction_MOTOR1_TOE,	    //正反转调节矿石电机3个  2006
	friction_MOTOR2_TOE,
	friction_MOTOR3_TOE,
	friction_MOTOR4_TOE,

	chassis_A_TOE,
 // REFEREE_TOE,               //裁判系统学生串口离线检测
	//BOARD_GYRO_TOE,           //板载陀螺仪
	//BOARD_ACCEL_TOE,          //板载加速度
	//BOARD_MAG_TOE,           //板载磁力计
	//REFEREE_TOE,             //裁判系统学生串口
	//RM_IMU_TOE,              //外置陀螺仪
	//OLED_TOE,
	ERROR_LIST_LENGHT,       //设备数量
};


typedef __packed struct
{
	uint32_t new_time;
	uint32_t last_time;
	uint32_t lost_time;
	uint32_t work_time;
	uint16_t set_offline_time : 12;
	uint16_t set_online_time : 12;
	uint8_t enable : 1;
	uint8_t priority : 4;
	uint8_t error_exist : 1;
	uint8_t is_lost : 1;
	uint8_t data_is_error : 1;

	fp32 frequency;
	bool_t(*data_is_error_fun)(void);
	void (*solve_lost_fun)(void);
	void (*solve_data_error_fun)(void);
} error_t;


/**
  * @brief          检测任务
  * @param[in]      pvParameters: NULL
  * @retval         none
  */
extern void detect_task(void const* pvParameters);


/**
  * @brief          获取设备对应的错误状态
  * @param[in]      toe:设备目录
  * @retval         true(错误) 或者false(没错误)
  */
extern bool_t toe_is_error(uint8_t err);


/**
  * @brief          记录时间
  * @param[in]      toe:设备目录
  * @retval         none
  */
extern void detect_hook(uint8_t toe);


/**
  * @brief          得到错误列表
  * @param[in]      none
  * @retval         error_list的指针
  */
extern const error_t* get_error_list_point(void);

#endif
